import {
    asyncRouterMap
} from '@/router'
import Vue from 'vue'

/**
 * 
 * @param {*} router 
 * @param {*} authInfo
 */
function checkAuth(router, authInfo) {
    // 判断当前路由在权限数组中是否存在
    if (router.meta) {
        const metaInfo = router.meta
        if (!metaInfo.requiresAuth) {
            return true
        } else {
            if (metaInfo.index == 0) {
                return authInfo[metaInfo.type] ? true : false
            } else if (metaInfo.index == 1) {
                if (authInfo[metaInfo.type]) {
                    return authInfo[metaInfo.type][metaInfo.subType] ? true : false
                }
                return false
            } else {
                var typeAuth = authInfo[metaInfo.type]
                for (let index = 0; index < metaInfo.subType.length; index++) {
                    const field = metaInfo.subType[index];
                    typeAuth = typeAuth[field]
                    if (typeAuth && metaInfo.subType.length - 1 == index) {
                        return true
                    } else if (!typeAuth) {
                        return false
                    }
                }
            }
        }
    }
    return true
}

/**
 * 
 * @param {*} routers 
 * @param {*} authInfo 
 */
const filterAsyncRouter = function(routers, authInfo) {
    const res = []
    routers.forEach(router => {
        const tmp = {
            ...router
        }
        if (checkAuth(tmp, authInfo)) {
            if (tmp.children) {
                tmp.children = filterAsyncRouter(tmp.children, authInfo)
            }
            res.push(tmp)
        }
    })
    return res
}

const permission = {
    state: {
        addRouters: [],
        crmRouters: {
            name: 'crm',
            children: []
        },
        biRouters: {
            name: 'bi',
            children: []
        },
        manageRouters: {
            name: 'manager',
            children: []
        },
        oaRouters: {
            name: 'oa',
            children: []
        },
        hrRouters: {
            name: 'hr',
            children: []
        },
        financeRouters: {
            name: 'finance',
            children: []
        },
    },
    mutations: {
        SET_ROUTERS: (state, routers) => {
            state.addRouters = routers
            for (let index = 0; index < routers.length; index++) {
                const element = routers[index]
                if (element.name == 'oa') {
                    state.oaRouters = element
                } else if (element.name == 'crm') {
                    state.crmRouters = element
                } else if (element.name == 'bi') {
                    state.biRouters = element
                } else if (element.name == 'manager') {
                    state.manageRouters = element
                } else if (element.name == 'hr') {
                    state.hrRouters = element
                } else if (element.name == 'finance') {
                    state.financeRouters = element
                }
            }
        },

        /**
         * 客户管理待办消息数
         */
        SET_CRMROUTERSNUM: (state, num) => {
            const messageItem = state.crmRouters.children[1]
            messageItem.meta.num = num
            Vue.set(state.crmRouters.children, 1, messageItem)
        }

    },
    actions: {
        GenerateRoutes({
            commit
        }, data) {
            return new Promise(resolve => {
                const accessedRouters = filterAsyncRouter(asyncRouterMap, data)
                let redirect = ''
                for (let index = 0; index < accessedRouters.length; index++) {
                    const element = accessedRouters[index]
                    if (element.children && element.children.length > 0) {
                        element.redirect = element.path + '/' + element.children[0].path
                    }

                    // 获取跳转
                    if (element.redirect && !redirect) {
                        redirect = element.redirect
                    }
                }
                if (redirect) {
                    accessedRouters.push({
                        path: '/',
                        redirect: redirect,
                        hidden: true
                    })
                }
                commit('SET_ROUTERS', accessedRouters)
                resolve()
            })
        }
    }
}

export default permission